Back
Project Header Image

An Interactive Path Tracing Renderer Based on Optix

Date: June, 2024

GitHub: Project Repository

Introduction Video

Project Description

项目环境

OptiX 7
CUDA 12
Visual Studio 2022

项目结构

LauchParams.h 缓冲区结构体
Material_def.h 材质结构体
MyInteraction.h 求交结构体
Model.h 模型加载
MyMaterial.h bsdf函数
MyTools.h 工具函数
PostProcess.h 屏幕空间后处理
SampleRenderer.h 渲染器架构
deviceProgram.cu 着色器代码
MyShader.c char[]格式着色器机器码

实现功能

GPU加速
蒙特卡洛路径追踪
PBR材质
直接光采样
时域降噪
环境光贴图
纹理贴图
法向插值
屏幕空间后处理

实现细节

GPU加速

基本只是调用OptiX API,代码参考了 https://github/ingowald/optix7course/tree/master

蒙特卡洛路径追踪

使用最传统的蒙特卡洛算法
spp = 1
maxbounce = 24

PBR材质

分为diffuse、specular、dielectric三种bsdf函数,通过材质的metallic和transmission参数(mtl格式中的Tf[0],0表示完全不透射,1表示完全透射)计算选择每一种bsdf函数的概率,详见MyMaterial.h中的cal_bsdf函数

diffuse bsdf:

采样:均匀在半球采样
bsdf计算公式:
bsdf

specular bsdf:

采样:一种近似的bsdf采样,根据roughness对完美反射向量和随机在半球采样得到的向量进行插值
bsdf计算公式:
bsdf

dielectric bsdf:

采样:根据roughness对完美折射向量和随机在半球采样得到的向量进行插值
全反射和菲涅尔现象:从介质射入空气时,考虑是否发生全反射,同时每次光线弹舌时,根据菲涅尔系数计算发射折射与反射的概率

直接光采样

为解决封闭场景中难以采样光源的问题,对diffuse材质额外采用直接光采样。 光线与模型相交后,如果是diffuse材质,则从面光源上随机选一点发射一条shadowray对光源进行采样

时域降噪

给每个像素一个buffer储存平均颜色信息,当视角改变后清空buffer重新计算

环境光贴图

读取hdr格式环境光纹理,转换到rgb空间

屏幕空间后处理

对储存每个像素颜色信息的buffer进行操作,转换到hsv空间调整亮度、饱和度、对比度再转换回rgb空间

效果展示

image image image image image image image image